package mymyoux.io.mserveur.mcontactClasses
{
	import mymyoux.events.MEventDispatcher;
	import mymyoux.io.mserveur.events.MRoomEvent;
	import mymyoux.io.mserveur.MContacts;
	import mymyoux.io.mserveur.MRoom;
	import mymyoux.io.mserveur.mcontactClasses.events.MLoginsEvent;
	import mymyoux.io.mserveur.mcontactClasses.events.MRoomContactsEvent;
	import mymyoux.io.mserveur.mcontactClasses.events.PeopleEvent;
    	/**
     * MRoomContacts dispatche l'event people_data quand un client envoie une donnée.
     * @eventType mymyoux.io.mserveur.mcontactClasses.events.PeopleEvent
     */
    [Event(name="people_data", type="mymyoux.io.mserveur.mcontactClasses.events.PeopleEvent")]
    	/**
     * MRoomContacts dispatche l'event people_in quand un client se connecte dans le salon et/ou s'identifie.
     * @eventType mymyoux.io.mserveur.mcontactClasses.events.MRoomContactsEvent
     */
    [Event(name="people_in", type="mymyoux.io.mserveur.mcontactClasses.events.MRoomContactsEvent")]
     /**
     * MRoomContacts dispatche l'event people_out quand un client se déconnecte du salon.
     * @eventType mymyoux.io.mserveur.mcontactClasses.events.MRoomContactsEvent
     */
    [Event(name="people_out", type="mymyoux.io.mserveur.mcontactClasses.events.MRoomContactsEvent")]
	/**
	 * Gère la liste de contacts spécifique à un salon.
	 */
	public class MRoomContacts extends MEventDispatcher
	{
		/**
		 * Tableau des idx des clients présents.
		 */
		protected var contacts:Array;
		/**
		 * Liste de contact générale.
		 */
		protected var mcontacts:MContacts;
		/**
		 * Salon auquel est reliée la liste de contacts.
		 */
		protected var room:MRoom;
		/**
		 * Crée un gestionnaire de liste de contacts relié à un salon.
		 * @param mcontacts Liste de contact générale du MAdvBinSocket.
		 * @param room Salon à gérer.
		 */
		public function MRoomContacts(mcontacts:MContacts,room:MRoom)
		{
			this.mcontacts=mcontacts;
			contacts=new Array();
			this.room=room;
			loadListeners()
		}
		/**
		 * Retourne tous les contacts connectés et identifiés.
		 * @return Un tableau de contacts.
		 */
		public function getContacts():Array
		{
			var listContacts:Array=new Array();
			var i:int=0;
			var people:People;
			for(;i<contacts.length;i++)
			{
				people=mcontacts.getPeople(contacts[i]);
				if(people.login.length>0)
				{
					listContacts.push(people);
				}
			}
			return listContacts;			
		}
		/**
		 * Appeler par MRoom pour indiquer la venue de une ou plusieurs personnes
		 * @param idx Soit un nombre, soit un tableau de nombre donc le premier indice contient la liste des idx.
		 */
		public function add(...idx):void
		{
			if(idx.length>0)
			{
				//soit idx est juste une liste d'idx soit c'est un tableau avec une case unique contenant la suite d'idx
				if(idx.length==1 && idx[0] is Array)
				{
					for(var i:int=0;i<idx[0].length;i++)
					{
						add(idx[0][i]);
					}
				}else
				{
					if(!has(Number(idx[0])))
					{
						contacts.push(Number(idx[0]));
					}
				}
			}
			
		}
		/**
		 * Appeler par MRoom pour indiquer la sortie de une ou plusieurs personnes
		 * @param idx Soit un nombre, soit un tableau de nombre donc le premier indice contient la liste des idx.
		 */
		public function rem(...idx):void
		{
				if(idx.length>0)
			{
				//soit idx est juste une liste d'idx soit c'est un tableau avec une case unique contenant la suite d'idx
				if(idx.length==1 && idx[0] is Array)
				{
					for(var i:int=0;i<idx[0].length;i++)
					{
						add(idx[0][i]);
					}
				}else
				{
					var id:int;
					if((id=contacts.indexOf(Number(idx[0])))>-1)
					{
						if(mcontacts.hasPeople(contacts[id]))
						{
							this.dispatchEvent(new MRoomContactsEvent(MRoomContactsEvent.PEOPLE_OUT,room,this.mcontacts.getPeople(contacts[id])));	
						}
						contacts.splice(id,1);
					}
				}
			}
			
			
		}
		/**
		 * Permet d'écouter tous les évènements.
		 */
		protected function loadListeners():void
		{
			mcontacts.addEventListener(MLoginsEvent.NEW_LOGIN,onLogin);
			room.addEventListener(MRoomEvent.DISCONNECT,onDisconnect);
		}
		/**
		 * Permet de retirer de l'écoute tous les évènements.
		 */
		protected function unloadListeners():void
		{
			mcontacts.removeEventListener(MLoginsEvent.NEW_LOGIN,onLogin);
			room.removeEventListener(MRoomEvent.DISCONNECT,onDisconnect);
		}
		/**
		 * Indique si le client représenté par l'idx est présent ou non dans le salon.
		 * @param idx Idx du client.
		 * @return true s'il est présent, false sinon.
		 */
		public function has(idx:uint):Boolean
		{
			return contacts.indexOf(idx)>-1;
		}
		/**
		 * Appelée par MRoom lorsque celui-ci dispatche l'évènement lié à sa fermeture volontaire.
		 * Détruit les écouteurs et supprime les écoutes.
		 * @param event Evenement dispatché par MRoom
		 * @see mymyoux.events.MEventDispatcher#destroy()
		 */ 
		protected function onDisconnect(event:MRoomEvent):void
		{
			mcontacts.removeEventListener(MLoginsEvent.NEW_LOGIN,onLogin);
			this.destroy();
		}
		/**
		 * @inheritDoc
		 */
		public override function destroy():void
		{
			unloadListeners();
			super.destroy();
		}
		/**
		 * Appelée par MContacts quand un pseudonyme est récupéré, si l'idx est contenu dans contacts
		 * alors l'évènement MRoomContactsEvent.PEOPLE_IN est dispatché
		 * @param event Evenement dispatché par MContacts
		 * @see mymyoux.io.mserveur.mcontactClasses.MRoomContactsEvent#PEOPLE_IN
		 */ 
		protected function onLogin(event:MLoginsEvent):void
		{
			//le contact est ds le salon
			if(has(event.people.idx))
			{
				event.people.addRoom(this.room);
				this.dispatchEvent(new MRoomContactsEvent(MRoomContactsEvent.PEOPLE_IN,room,event.people));
			}
		}
		/**
		 * @copy mymyoux.io.mserveur.MRoom#sendAll()
		 */
		public function sendAll(value:*):void
		{
				this.room.sendAll(value);
		}
		/**
		 * @copy mymyoux.io.mserveur.MRoom#sendPeople()
		 */
		public function sendPeople(people:People,value:*):void
		{
			this.room.sendPeople(people,value);
		}
		/**
		 * @copy mymyoux.io.mserveur.MRoom#send()
		 */
		public function send(idx:uint,value:*):void
		{
			this.room.send(idx,value);
		}
	}
}